Skip to content

Sisc1 52 be 주식 베팅 게임 구현#95

Merged
discipline24 merged 6 commits intomainfrom
SISC1-52-BE-주식-베팅-게임-구현
Nov 12, 2025

Hidden character warning

The head ref may contain hidden characters: "SISC1-52-BE-\uc8fc\uc2dd-\ubca0\ud305-\uac8c\uc784-\uad6c\ud604"
Merged

Sisc1 52 be 주식 베팅 게임 구현#95
discipline24 merged 6 commits intomainfrom
SISC1-52-BE-주식-베팅-게임-구현

Conversation

@otter2023
Copy link
Member

@otter2023 otter2023 commented Nov 11, 2025

Summary by CodeRabbit

릴리스 노트

  • Documentation

    • API 문서가 Swagger/OpenAPI 형식으로 개선되었습니다. 엔드포인트, 요청 매개변수, 응답 형식이 명확히 문서화되었습니다.
  • Bug Fixes

    • 베팅 요청 시 최소 포인트 유효성 검사를 강화했습니다.
    • 베팅 라운드 정산 로직에 중복 정산 방지 기능을 추가했습니다.

@coderabbitai
Copy link

coderabbitai bot commented Nov 11, 2025

개요

이 변경사항은 베팅 모듈 전반에 Swagger/OpenAPI 문서화 주석을 추가하고, BettingController의 경로 변수를 문자열에서 Scope 열거형으로 변경하며, UserBetRequest에 검증 로직을 강화하고, BetRound 엔티티의 결제 로직에 보호 장치를 추가하고, Scope 열거형에 Jackson 직렬화 헬퍼를 도입합니다.

변경사항

코호트 / 파일 변경 요약
API 문서화 및 주석
BettingController.java
Swagger @Tag, @Operation, @Parameter, @ApiResponse 주석 추가; 모든 엔드포인트에 대한 API 문서화 강화; 민감한 보안 파라미터를 @AuthenticationPrincipal로 표시하여 API 문서에서 숨김
타입 안전성 및 경로 변수 개선
BettingController.java
getTodayBetRound 엔드포인트에서 경로 변수를 String에서 Scope 열거형으로 변경; 수동 Scope.valueOf() 파싱 제거
요청 DTO 스키마 및 검증
UserBetRequest.java
@Schema 주석을 클래스 및 모든 공개 필드에 추가; 새로운 isStakePointsValid() 검증 메서드 도입 (@AssertTrue 사용)
엔티티 문서화 및 결제 로직 강화
BetRound.java
@Schema 주석을 모든 공개 필드에 추가; settle() 메서드에 보호 장치 추가 (중복 결제 방지, null 검증)
직렬화 헬퍼 및 Jackson 통합
Scope.java
공개 정적 메서드 from(String value) 및 공개 인스턴스 메서드 toValue() 추가; Jackson @JsonCreator/@jsonvalue 호환성 지원; DayOfWeek 임포트 추가

추정 코드 리뷰 소요 시간

🎯 2 (단순) | ⏱️ ~10분

  • 특별히 주의할 사항:
    • BettingController의 getTodayBetRound에서 Scope 열거형 바인딩 동작 확인
    • UserBetRequest.isStakePointsValid()의 검증 로직 (무료 베팅 시 조건) 검증
    • BetRound.settle() 메서드의 null 체크 및 재결제 방지 로직 확인
    • Scope.from(String) 메서드의 null 처리 및 대문자 변환 동작 확인

관련 PR

추천 리뷰어

  • discipline24
  • msciki7

🐰 문서화의 봄이 피어나고,
검증의 방패가 든든하네,
Scope는 이제 Jackson의 친구,
베팅 엔진은 더욱 똑똑해지고,
코드의 정원이 한껏 피어난다! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 36.84% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목은 주식 베팅 게임 구현이라는 주요 변경사항을 명확하게 요약하고 있으며, 변경된 파일들(BettingController, UserBetRequest, BetRound, Scope)의 수정 내용과 일치합니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch SISC1-52-BE-주식-베팅-게임-구현

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0e54bbd and cd8d834.

📒 Files selected for processing (3)
  • backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/betting/dto/UserBetRequest.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/common/exception/ErrorCode.java (1 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java (1)
backend/src/main/java/org/sejongisc/backend/auth/controller/EmailController.java (1)
  • Tag (15-74)
🔇 Additional comments (3)
backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java (1)

3-6: Swagger/OpenAPI 문서화가 잘 구현되었습니다.

모든 엔드포인트에 명확한 설명과 예제가 추가되었으며, 다음과 같은 좋은 관행을 따르고 있습니다:

  • 인증 principal 파라미터를 @Parameter(hidden = true)로 Swagger UI에서 숨김 처리
  • 각 엔드포인트의 가능한 응답 코드를 명확하게 문서화
  • 한국어로 상세한 설명과 내부 로직 설명 제공
  • 파라미터에 예제 값 포함

API 문서의 품질이 우수하여 API 사용자들이 쉽게 이해할 수 있습니다.

Also applies to: 29-143

backend/src/main/java/org/sejongisc/backend/betting/dto/UserBetRequest.java (2)

38-42: 유효성 검증 로직이 올바르게 구현되었습니다.

isStakePointsValid() 메서드의 검증 로직이 정확합니다:

  • 무료 베팅(free = true)인 경우 포인트 검증을 건너뜀
  • 유료 베팅인 경우 stakePoints가 null이 아니고 10 이상이어야 함
  • ErrorCode.BET_POINT_TOO_LOW와 일관성 있게 최소 10포인트 요구사항을 적용

@Schema(hidden = true) 사용으로 내부 검증 메서드를 API 문서에서 적절히 숨김 처리했습니다.


4-4: Swagger 스키마 문서화가 명확합니다.

모든 필드에 적절한 설명과 예제가 추가되었으며, requiredMode를 사용하여 필수 필드를 명확하게 표시했습니다. DTO의 목적과 각 필드의 역할을 API 사용자가 쉽게 이해할 수 있습니다.

Also applies to: 20-20, 23-23, 27-27, 31-31, 35-35

discipline24
discipline24 previously approved these changes Nov 12, 2025
Copy link
Contributor

@discipline24 discipline24 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
backend/src/main/java/org/sejongisc/backend/betting/entity/BetRound.java (2)

49-50: TODO 주석에 대한 검토를 권장합니다.

현재 boolean 타입으로 상태를 관리하고 있으며, Enum 클래스로의 변경을 고려하는 TODO 주석이 있습니다. 향후 라운드 상태가 더 세분화될 경우(예: PENDING, OPEN, LOCKED, SETTLED 등), Enum을 사용하면 타입 안정성과 확장성이 개선될 수 있습니다.

Enum 기반의 상태 관리 구현을 원하시면 코드를 생성해드릴 수 있습니다.


107-120: 정산 로직에 적절한 가드가 추가되었습니다.

중복 정산 방지(lines 111-113)와 finalPrice null 체크(lines 114-116)가 추가되어 안정성이 향상되었습니다. 다만 다른 비즈니스 로직에서는 CustomException을 사용하는 반면, 여기서는 IllegalArgumentException을 사용하고 있습니다. 일관성을 위해 CustomException과 적절한 ErrorCode를 사용하는 것을 고려해보세요.

예시:

-        if (finalPrice == null) {
-            throw new IllegalArgumentException("finalPrice must not be null");
-        }
+        if (finalPrice == null) {
+            throw new CustomException(ErrorCode.INVALID_FINAL_PRICE);
+        }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cd8d834 and 757fe9c.

📒 Files selected for processing (3)
  • backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java (2 hunks)
  • backend/src/main/java/org/sejongisc/backend/betting/entity/BetRound.java (3 hunks)
  • backend/src/main/java/org/sejongisc/backend/betting/entity/Scope.java (2 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java (1)
backend/src/main/java/org/sejongisc/backend/auth/controller/EmailController.java (1)
  • Tag (15-74)
🔇 Additional comments (10)
backend/src/main/java/org/sejongisc/backend/betting/entity/BetRound.java (2)

3-77: Swagger 문서화 어노테이션이 적절하게 추가되었습니다.

모든 필드에 명확한 한국어 설명이 포함된 @Schema 어노테이션이 추가되어 API 문서의 가독성이 향상되었습니다.


122-127: 가격 동일 케이스의 비즈니스 로직을 확인하세요.

현재 finalPricepreviousClosePrice와 정확히 같을 경우(compare == 0) RISE로 판정됩니다. 실제 주식 시장에서는 가격이 변동 없을 때를 별도로 처리하거나, 무승부로 간주하는 경우가 많습니다. 이것이 의도된 비즈니스 로직인지 확인하시기 바랍니다.

만약 동일 가격일 때 특별한 처리가 필요하다면:

 private BetOption determineResult(BigDecimal finalPrice) {
     int compare = finalPrice.compareTo(previousClosePrice);
-    if (compare >= 0) return BetOption.RISE;
-    return BetOption.FALL;
+    if (compare > 0) return BetOption.RISE;
+    if (compare < 0) return BetOption.FALL;
+    // 동일한 경우의 처리 (예: return BetOption.DRAW 또는 null)
+    return BetOption.RISE; // 또는 비즈니스 요구사항에 맞는 처리
 }
backend/src/main/java/org/sejongisc/backend/betting/entity/Scope.java (3)

3-6: Jackson 직렬화 지원 및 DayOfWeek 사용이 적절합니다.

Jackson 어노테이션 추가로 enum의 직렬화/역직렬화가 명확해졌으며, DayOfWeek 상수 사용으로 가독성이 향상되었습니다.

Also applies to: 23-30


36-40: from() 메서드의 예외 처리를 확인하세요.

valueOf(value.toUpperCase())는 유효하지 않은 값에 대해 IllegalArgumentException을 던집니다. @PathVariable로 사용될 때 Spring이 이를 400 Bad Request로 변환하지만, 사용자에게 더 명확한 에러 메시지를 제공하려면 명시적인 예외 처리를 고려하세요.

더 명시적인 에러 처리 예시:

 @JsonCreator
 public static Scope from(String value) {
     if (value == null) return null;
+    try {
         return Scope.valueOf(value.toUpperCase());
+    } catch (IllegalArgumentException e) {
+        throw new IllegalArgumentException("Invalid scope value: " + value + ". Must be DAILY or WEEKLY.");
+    }
 }

다만 현재 구현도 Spring의 기본 처리로 충분할 수 있으니, 프로젝트의 에러 처리 정책에 따라 판단하시기 바랍니다.


42-45: toValue() 메서드가 올바르게 구현되었습니다.

@JsonValue 어노테이션을 통해 enum이 문자열로 직렬화되는 방식이 명확하게 정의되었습니다.

backend/src/main/java/org/sejongisc/backend/betting/controller/BettingController.java (5)

3-6: Swagger 문서화를 위한 어노테이션이 적절하게 추가되었습니다.

API 그룹화를 위한 @Tag 어노테이션과 필요한 import 문이 올바르게 추가되었습니다.

Also applies to: 29-29


34-60: 경로 변수를 Enum 타입으로 변경한 것은 좋은 개선입니다.

@PathVariable String scope@PathVariable Scope scope로 변경하여 타입 안정성이 향상되었으며, 수동 파싱 로직이 제거되었습니다. Spring MVC가 Scope.from() 메서드(@JsonCreator)를 통해 자동으로 바인딩하므로, 유효하지 않은 값에 대해서는 자동으로 400 에러가 반환됩니다.

Swagger 문서도 명확하게 작성되었습니다.


63-77: 베팅 라운드 이력 조회 엔드포인트 문서화가 명확합니다.

API 동작과 향후 확장 가능성이 잘 설명되어 있습니다.


79-101: 베팅 등록 엔드포인트 문서화가 상세하고 적절합니다.

무료/유료 베팅의 차이, 예상되는 응답 코드, 그리고 인증 파라미터를 API 문서에서 숨기는 처리가 모두 적절하게 구현되었습니다.


103-144: 베팅 취소 및 이력 조회 엔드포인트 문서화가 잘 작성되었습니다.

두 엔드포인트 모두 명확한 설명, 적절한 응답 코드, 그리고 유용한 예시 값(UUID)이 포함되어 있어 API 사용자에게 도움이 됩니다.

@discipline24 discipline24 merged commit c9a79d7 into main Nov 12, 2025
1 check passed
@discipline24 discipline24 deleted the SISC1-52-BE-주식-베팅-게임-구현 branch November 12, 2025 14:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants